package wx

import (
	"crypto/sha1"
	"fmt"
	"github.com/gin-gonic/gin"
	"io"
	"log"
	"net/http"
	"sort"
	"strings"
)

const (
	token = "2206A" // 设置 token
)

func makeSignature(timestamp, nonce string) string { // 本地计算 signature
	si := []string{token, timestamp, nonce}
	sort.Strings(si)            // 字典序排序
	str := strings.Join(si, "") // 组合字符串
	s := sha1.New()             // 返回一个新的使用 SHA1 校验的 hash.Hash 接口
	io.WriteString(s, str)      // WriteString 函数将字符串数组 str 中的内容写入到 s 中
	return fmt.Sprintf("%x", s.Sum(nil))
}

func validateUrl(c *gin.Context) bool {
	timestamp := c.Query("timestamp")
	nonce := c.Query("nonce")
	signature := c.Query("signature")
	echostr := c.Query("echostr")
	signatureGen := makeSignature(timestamp, nonce)

	if signatureGen != signature {
		return false
	}
	c.String(http.StatusOK, echostr) // 原样返回 echostr 给微信服务器
	return true
}

func ProcSignature(c *gin.Context) {
	if !validateUrl(c) {
		log.Println("Wechat Service: This http request is not from wechat platform")
		c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid signature"})
		return
	}
	log.Println("validateUrl Ok")
}
